// 引入网络请求库 https://github.com/axios/axios

import axios from 'axios'
import { Toast } from 'antd-mobile'
import { YQL, CORS, footerText } from './config'
import qs from 'qs'
import pathToRegexp from 'path-to-regexp'
import lodash from 'lodash'
import jsonp from 'jsonp'
// import store from '../store'
// import router from '../router'

// // 请求列表
// const requestList = []
// // 取消列表
// const CancelToken = axios.CancelToken
// let sources = {}

axios.defaults.timeout = 10000
// axios.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8'

// axios.defaults.baseURL = process.env.BASE_URL

axios.interceptors.request.use((config) => {
  Toast.loading("加载中", 0);
  return config
}, function (error) {
  return Promise.reject(error)
})

axios.interceptors.response.use(function (response) {
  Toast.hide();
  return response
}, function (error) {
  return Promise.reject(error)
})

const fetch = (options) => {
    let {
      method = 'get',
      data,
      fetchType,
      url
    } = options
  
    console.log(footerText);
    const cloneData = lodash.cloneDeep(data)
  
    try {
      let domin = ''
      if (url.match(/[a-zA-z]+:\/\/[^/]*/)) {
        domin = url.match(/[a-zA-z]+:\/\/[^/]*/)[0]
        url = url.slice(domin.length)
      }
      const match = pathToRegexp.parse(url)
      url = pathToRegexp.compile(url)(data)
      for (let item of match) {
        if (item instanceof Object && item.name in cloneData) {
          delete cloneData[item.name]
        }
      }
      url = domin + url
    } catch (e) {
        Toast.fail(e.message)
    }
  
    if (fetchType === 'JSONP') {
      return new Promise((resolve, reject) => {
        jsonp(url, {
          param: `${qs.stringify(data)}&callback`,
          name: `jsonp_${new Date().getTime()}`,
          timeout: 4000,
        }, (error, result) => {
          if (error) {
            reject(error)
          }
          resolve({ statusText: 'OK', status: 200, data: result })
        })
      })
    } else if (fetchType === 'YQL') {
      url = `http://query.yahooapis.com/v1/public/yql?q=select * from json where url='${options.url}?${encodeURIComponent(qs.stringify(options.data))}'&format=json`
      data = null
    }
  
    switch (method.toLowerCase()) {
      case 'get':
        return axios.get(url, {
          params: cloneData,
        })
      case 'delete':
        return axios.delete(url, {
          data: cloneData,
        })
      case 'post':
     // options.params =options.data
       //return axios(options)
        return axios.post(url, cloneData)
      case 'put':
        return axios.put(url, cloneData)
      case 'patch':
        return axios.patch(url, cloneData)
      default:
        return axios(options)
    }
  }
  
  export default function request (options) {
    // if (options.url && options.url.indexOf('//') > -1) {
    //   const origin = `${options.url.split('//')[0]}//${options.url.split('//')[1].split('/')[0]}`
    //   if (window.location.origin !== origin) {
    //     if (CORS && CORS.indexOf(origin) > -1) {
    //       options.fetchType = 'CORS'
    //     } else if (YQL && YQL.indexOf(origin) > -1) {
    //       options.fetchType = 'YQL'
    //     } else {
    //       options.fetchType = 'JSONP'
    //     }
    //   }
    // }
  
    return fetch(options).then((response) => {
      const { statusText, status } = response
      let data = options.fetchType === 'YQL' ? response.data.query.results.json : response.data.data
      if (data instanceof Array) {
        data = {
          list: data
        }
      }
      // if (!data.flag)  Toast.fail(data.message)
      return Promise.resolve({
        success: data.flag,
        message: statusText,
        statusCode: status,
        ...data
      })
    }).catch((error) => {
      const { response } = error
      let msg
      let statusCode
      if (response && response instanceof Object) {
        const { data, statusText } = response
        statusCode = response.status
        msg = data.message || statusText
      } else {
        statusCode = 600
        msg = error.message || 'Network Error'
      }
      Toast.fail(msg)
      return Promise.reject({ success: false, statusCode, message: msg, flag: false })
    })
  }
  
